package com.hds.modules.app.entity.wx.handler;


import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.hds.modules.app.entity.wx.common.Common;
import com.hds.modules.app.entity.wx.common.CommonUtils;
import com.hds.modules.app.entity.wx.common.WxConstants;
import com.hds.modules.app.entity.wx.po.UnifiedOrder;
import com.hds.modules.app.entity.wx.po.UnifiedOrderResult;
import com.hds.modules.app.entity.wx.po.WxUnifiedOrder;
import com.hds.modules.app.entity.wx.po.WxUnifiedOrderResult;
import com.hds.modules.app.entity.wx.utils.WxPayUtils;
import com.jfinal.kit.HttpKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 微信支付，统一下单接口处理类
 * @author guonan
 * @version 1.0
 */
public class UnifiedOrderApi {

     static Logger logger = LoggerFactory.getLogger(UnifiedOrderApi.class);
    /**
     * 统一下单接口
     */
    private static String unifiedorderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";

    /**
     * 统一下单请求数据签名
     * @param wxUnifiedOrder
     * @return
     */
    private static String getUnifiedOrderRquestSign(WxUnifiedOrder wxUnifiedOrder,String apiKey)
    {
        String[] paramNames = new String[]{
                "appid","mch_id","device_info","nonce_str","body","detail","attach","out_trade_no",
                "fee_type", "total_fee", "spbill_create_ip", "time_start", "time_expire", "goods_tag",
                "notify_url", "trade_type", "product_id", "openid"
        };
        Map<String,String> paramValueMap = new HashMap<String,String>();
        paramValueMap.put("appid", wxUnifiedOrder.getAppid());
        paramValueMap.put("mch_id", wxUnifiedOrder.getMch_id());
        paramValueMap.put("device_info", wxUnifiedOrder.getDevice_info());
        paramValueMap.put("nonce_str", wxUnifiedOrder.getNonce_str());
        paramValueMap.put("body", wxUnifiedOrder.getBody());
        paramValueMap.put("detail", wxUnifiedOrder.getDetail());
        paramValueMap.put("attach", wxUnifiedOrder.getAttach());
        paramValueMap.put("out_trade_no", wxUnifiedOrder.getOut_trade_no());
        paramValueMap.put("fee_type", wxUnifiedOrder.getFee_type());
        paramValueMap.put("total_fee", wxUnifiedOrder.getTotal_fee());
        paramValueMap.put("spbill_create_ip", wxUnifiedOrder.getSpbill_create_ip());
        paramValueMap.put("time_start", wxUnifiedOrder.getTime_start());
        paramValueMap.put("time_expire", wxUnifiedOrder.getTime_expire());
        paramValueMap.put("goods_tag", wxUnifiedOrder.getGoods_tag());
        paramValueMap.put("notify_url", wxUnifiedOrder.getNotify_url());
        paramValueMap.put("trade_type", wxUnifiedOrder.getTrade_type());
        paramValueMap.put("product_id", wxUnifiedOrder.getProduct_id());
        paramValueMap.put("openid", wxUnifiedOrder.getOpenid());
        paramValueMap.put(WxConstants.APIKEY, apiKey);

        String sign = WxPayUtils.getPaySignMD5(paramNames,paramValueMap);
        return sign;
    }


    /**
     * 统一下单接口
     * @return
     * @throws Exception
     */
    public static UnifiedOrderResult unifiedOrderK(UnifiedOrder unifiedOrder, HttpServletRequest request) throws Exception{

//    	商品描述	body	是	String(32)	Ipad mini  16G  白色	商品或支付单简要描述
//    	商品详情	detail	否	String(8192)	Ipad mini  16G  白色	商品名称明细列表
//    	附加数据	attach	否	String(127)	深圳分店	附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
//    	商户订单号	out_trade_no	是	String(32)	20150806125346	商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
//    	货币类型	fee_type	否	String(16)	CNY	符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
//    	总金额	total_fee	是	Int	888	订单总金额，单位为分，详见支付金额
//    	终端IP	spbill_create_ip	是	String(16)	123.12.12.123	APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP。
//    	交易起始时间	time_start	否	String(14)	20091225091010	订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
//    	交易结束时间	time_expire	否	String(14)	20091227091010
//    	订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
//    	注意：最短失效时间间隔必须大于5分钟
//    	商品标记	goods_tag	否	String(32)	WXG	商品标记，代金券或立减优惠功能的参数，说明详见代金券或立减优惠
//    	通知地址	notify_url	是	String(256)	http://www.weixin.qq.com/wxpay/pay.php	接收微信支付异步通知回调地址
//    	交易类型	trade_type	是	String(16)	JSAPI	取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
//    	商品ID	product_id	否	String(32)	12235413214070356458058	trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
//    	指定支付方式	limit_pay	否	String(32)	no_credit	no_credit--指定不能使用信用卡支付
//    	用户标识	openid	否	String(128)	oUpF8uMuAJO_M2pxb1Q9zNjWeS6o	trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。openid如何获取，可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid，再调用【企业号userid转openid接口】进行转换


        //微信下单参数对象
        WxUnifiedOrder wxUnifiedOrder = new WxUnifiedOrder();

        //业务层传过来的数据，以后根据实际需求进行扩展
        wxUnifiedOrder.setAppid(unifiedOrder.getAppid());
        wxUnifiedOrder.setOpenid(unifiedOrder.getOpenid());
        wxUnifiedOrder.setBody(unifiedOrder.getBody());
        wxUnifiedOrder.setOut_trade_no(unifiedOrder.getOut_trade_no());
        //wxUnifiedOrder.setTotal_fee(unifiedOrder.getTotal_fee());
        wxUnifiedOrder.setTotal_fee(unifiedOrder.getTotal_fee());//这里的单位是分
        wxUnifiedOrder.setSpbill_create_ip(unifiedOrder.getSpbill_create_ip());
        wxUnifiedOrder.setTime_start(unifiedOrder.getTime_start());
        wxUnifiedOrder.setTime_expire(unifiedOrder.getTime_expire());
        wxUnifiedOrder.setGoods_tag(unifiedOrder.getGoods_tag());
        wxUnifiedOrder.setDevice_info(unifiedOrder.getDevice_info());
        wxUnifiedOrder.setDetail(unifiedOrder.getDetail());
        wxUnifiedOrder.setAttach(unifiedOrder.getAttach());
        wxUnifiedOrder.setProduct_id(unifiedOrder.getProduct_id());

        //底层配置数据
        String apiKey = Common.APIKEY;//商户apiKey
        String mchId = Common.MCHID;//商户号
        String netHost = Common.NETHOST;
        System.out.println("===apiKey=="+apiKey);
        System.out.println("===mchId=="+mchId);
        if (!netHost.endsWith("/")) {
            netHost += "/";
        }
        netHost += request.getContextPath() + "/WechatPayNotifyAction.do";
        String notifyUrl =  netHost;
        wxUnifiedOrder.setMch_id(mchId);
        wxUnifiedOrder.setNotify_url(notifyUrl);
        wxUnifiedOrder.setNonce_str(CommonUtils.getRandomStr(32));
        wxUnifiedOrder.setTrade_type("JSAPI");//先默认只支持JSAPI方式下单
        wxUnifiedOrder.setFee_type("CNY");
        wxUnifiedOrder.setSign(getUnifiedOrderRquestSign(wxUnifiedOrder,apiKey));

        //创建请求报文，发送请求
        String requestXML = wxUnifiedOrder.creatRequestXML(wxUnifiedOrder);

        //保存下单请求日志
//        InterfaceLogUtils.writeLog(WxConstants.LOGMODE_SEND, WxConstants.INTERFACEKIND_PAYMENT, WxConstants.OPERATECODE_UNIFIEDORDER,
//                unifiedOrder.getBusinessNo(), unifiedOrder.getOut_trade_no(), "MD5", "", requestXML);
        logger.info("保存下单请求日志 requestXML:" + requestXML);
        String resultXML = HttpKit.post(unifiedorderUrl, requestXML);
        logger.info("保存下单响应日志 requestXML:" + resultXML);
       // String resultXML = HttpUtils.doPostStr(unifiedorderUrl, requestXML).toJSONString();
        //保存下单返回日志
//        InterfaceLogUtils.writeLog(WxConstants.LOGMODE_RECEIVE, WxConstants.INTERFACEKIND_PAYMENT, WxConstants.OPERATECODE_UNIFIEDORDER,
//                unifiedOrder.getBusinessNo(), unifiedOrder.getOut_trade_no(), "MD5", "", resultXML);
        //解析返回数据
        WxUnifiedOrderResult wxunifiedOrderResult = new WxUnifiedOrderResult().getWxUnifiedOrderResult(resultXML,apiKey);

        //获取统一下单返回数据业务层对象
        UnifiedOrderResult unifiedOrderResult = new UnifiedOrderResult().getUnifiedOrderResult(wxunifiedOrderResult,apiKey);

        return unifiedOrderResult;
    }

}